AWS WAF を利用して、WordPress「XML-RPC」への不正アクセスを制限してみた
はじめに
AWSチームのすずきです。
ALB(Application Load Balancer)に対応した「AWS WAF」を利用し、 WordPressのAPI(XML-RPC)への不正な呼び出しを制限する機会がありました。 その設定方法について紹介させて頂きます。
経緯
- WordPressのAPI(XML-RPC)に対し、多数の「xmlrpc.php」宛のリクエストが発生
- 負荷分散に利用していたELBを、CLB→ALBと変更し、AWS WAFによるアクセス制限を実施しました
アクセスログ
- ELBのアクセスログより抜粋
- IP等はマスク済
2016-12-12T04:00:00.339366Z elb-name 51.00.00.00:42048 10.00.00.00:80 0.000035 0.084439 0.000093 200 200 301 370 "POST http://52.00.00.00:80/xmlrpc.php HTTP/1.0" "Mozilla/4.0 (compatible: MSIE 7.0; Windows NT 6.0)" - - 2016-12-12T04:00:00.567752Z elb-name 51.00.00.00:44392 10.00.00.00:80 0.000038 0.136221 0.000071 200 200 294 370 "POST http://52.00.00.00:80/xmlrpc.php HTTP/1.0" "Mozilla/4.0 (compatible: MSIE 7.0; Windows NT 6.0)" - - 2016-12-12T04:00:00.628673Z elb-name 51.00.00.00:59698 10.00.00.00:80 0.000033 0.088418 0.000049 200 200 294 370 "POST http://52.00.00.00:80/xmlrpc.php HTTP/1.0" "Mozilla/4.0 (compatible: MSIE 7.0; Windows NT 6.0)" - -
WAF設定
リクエストヘッダに含まれるURIとして「/xmlrpc.php」を含む全てのアクセスの制限を行いました。
Confitionの作成
- WAFのチェック対象とする条件を指定します
- リクエストヘッダ(URI)の文字列判定を行う条件として、「String matching」を指定し 「Create condition」を行います
Confition設定
- ALBで利用するリージョンの指定と、条件の名称を設定します
Filter 設定
- 対象として「URI」を指定します
- 判定条件は「Contains」部分一致とし、判定文字列は「/xmlrpc.php」とします
- URLエンコード、Base64エンコードされた不正呼び出しに備え、「Transformation」「Value is base64 encoded」の指定を実施しました
Rule 作成
- 先に作成した「Confition」を含む、「Rule」を作成します。
- 任意の名称と、保護対象のALBが存在するリージョンを指定します
- 先に作成した、「Condition」を指定し、ルールを作成します。
ACLの作成
- ACLを作成します。
- 任意のACL名と、保護対象のALBを指定します
- 保護対象のALB名は、予めEC2のロードバランサー画面で確認します。
- 今回は、作成済みの設定(Condition)を利用するため、そのまま「Next」に進みます
- 先に作成した「Rules」を指定します
- 今回、指定条件に一致したリクエストはアクセス禁止(Block)、他は全て許可(Allow)とする設定としました。
- 設定内容を確認し、ACLを作成します
確認
- 「/xmlrpc.php」を含むアクセス、HTTPレスポンスコード403が戻ります
- HTTPSでのアクセスも、WAFでブロックする事が可能です。
まとめ
ALBとAWS WAFを利用する事で、EC2のサーバリソースを圧迫する事無く、簡単にアクセス制限を実施する事が可能になりました。
安価な費用(1つのACLあたり5$、1つのルールあたり1$、100 万ウェブリクエストあたり 0.60 $)利用でき、 簡単な設定で不正アクセス制限を実現できる AWS WAF、 AWS上で稼働するWebアプリケーションの保護対策の一つとして是非ご活用ください。
- 公式ページ: AWS WAF (料金)